package com.warm.system.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.warm.core.constant.TenantConstants;
import com.warm.core.exception.ServiceException;
import com.warm.core.page.TableDataInfo;
import com.warm.orm.domain.sys.SysTenant;
import com.warm.system.api.orm.agent.SysTenantAgent;
import com.warm.system.service.ISysTenantService;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import org.noear.solon.data.annotation.Tran;

import java.util.Date;
import java.util.List;

/**
 * 租户Service业务层处理
 *
 * @author hh
 * @date 2023-10-27
 */
@Component
public class SysTenantServiceImpl implements ISysTenantService {

    @Inject(required = false)
    private SysTenantAgent tenantAgent;
    @Override
    public SysTenant selectById(Long id) {
        return tenantAgent.selectById(id);

    }
    @Override
    public SysTenant queryByTenantId(String tenantId) {
        return tenantAgent.queryByTenantId(tenantId);
    }

    @Override
    public TableDataInfo<SysTenant> selectPage(SysTenant sysTenant) {
        return tenantAgent.selectPage(sysTenant);
    }

    @Override
    public List<SysTenant> selectList(SysTenant sysTenant) {
        return tenantAgent.selectList(sysTenant);
    }

    @Override
    @Tran
    public boolean insert(SysTenant sysTenant) {
        return tenantAgent.insert(sysTenant);
    }

    @Override
    public boolean update(SysTenant sysTenant) {
        return tenantAgent.update(sysTenant);
    }

    @Override
    public boolean deleteByIds(Long[] ids) {
        return tenantAgent.deleteByIds(ids);
    }

    /**
     * 校验租户是否允许操作
     *
     * @param tenantId 租户ID
     */
    @Override
    public void checkTenantAllowed(String tenantId) {
        if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
            throw new ServiceException("不允许操作管理租户");
        }
    }

    @Override
    public boolean changeStatus(SysTenant sysTenant) {
        checkTenantAllowed(sysTenant.getTenantId());
        return tenantAgent.updateTenant(sysTenant);
    }

    /**
     * 校验企业名称是否唯一
     */
    @Override
    public boolean checkCompanyNameUnique(SysTenant sysTenant) {
        return tenantAgent.checkCompanyNameUnique(sysTenant);
    }

    /**
     * 校验账号余额
     */
    @Override
    public boolean checkAccountBalance(String tenantId) {
        return tenantAgent.checkAccountBalance(tenantId);
    }

    /**
     * 校验有效期
     */
    @Override
    public boolean checkExpireTime(String tenantId) {
        SysTenant tenant = queryByTenantId(tenantId);
        // 如果未设置过期时间代表不限制
        if (ObjectUtil.isNull(tenant.getExpireTime())) {
            return true;
        }
        // 如果当前时间在过期时间之前则通过
        return new Date().before(tenant.getExpireTime());
    }

    /**
     * 同步租户套餐
     */
    @Override
    @Tran
    public Boolean syncTenantPackage(String tenantId, Long packageId) {
        return tenantAgent.syncTenantPackage(tenantId, packageId);
    }

}
